package controllers;

import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Scanner;

import models.Constantes;
import models.UDPSocket;

public class UDPClientController {

	private UDPSocket udpSocketC;
	private UDPSocket udpSocketS;
	private BuscadorServer threadBuscador = null;
	private OuvirServer threadOuvir = null;
	private ArrayList<String> servs = null;
	private String iPDestino;
	private int Contador = 0;
	
	public UDPClientController(String iPDestino) {
		this.iPDestino = iPDestino;
		servs = new ArrayList<String>();
		udpSocketC = new UDPSocket(Constantes.PORTA_UDP_CLIENTE_ENV);
		udpSocketS = new UDPSocket(Constantes.PORTA_UDP_CLIENTE_REC);
		threadBuscador = new BuscadorServer();
		threadBuscador.start();
		threadOuvir = new OuvirServer();
		threadOuvir.start();
	}

	public ArrayList<String> getServidores(){
		return servs;
	}
	
	public void addServer(InetAddress ip, String nome, String nJogadores){
		String IP = String.copyValueOf(ip.toString().trim().toCharArray(), 1, ip.toString().trim().length()-1);
		String srv = IP + " - " + nJogadores.trim() + " Jogadores - Nome: " + nome.trim();
		if(!servs.contains(srv))
			servs.add(srv);
//System.out.println("add " + srv);
	}

	public void setAtivo(Boolean ativo){
		synchronized (threadBuscador) {
			if(ativo){			
				threadBuscador.pausada = false;
				threadBuscador.notify();
			}else
				threadBuscador.pausada = true;
		}	
		synchronized (threadOuvir) {
			if(ativo){			
				threadOuvir.pausada = false;
				threadOuvir.notify();
			}else
				threadOuvir.pausada = true;
		}		
	}
	
	public boolean isVisivel(){		
		synchronized (threadBuscador) {
			return !threadBuscador.pausada;		
		}
	}

	@SuppressWarnings("deprecation")
	public void stop() {
		setAtivo(false);
		udpSocketC.stop();
		udpSocketS.stop();
		threadBuscador.suspend();
		threadBuscador = null;
		threadOuvir.suspend();
		threadOuvir = null;
	}
	
	class BuscadorServer extends Thread {
		public boolean pausada = true; 
		
		public void run() {
//System.out.println("buscou");
			while(true){
				synchronized (this) {
					while(pausada){
						try {
							wait();
						} catch (Exception e) {
							System.out.println(e.getMessage());
						}
					}					
				}
				udpSocketC.enviarMsg(Constantes.CMD_ESTADO_SERVIDOR, iPDestino, 
						Constantes.PORTA_UDP_SERVIDOR);
				synchronized (this) {
					try {
						wait(Constantes.DELAY_NOVA_BUSCA);
					} catch (Exception e) {
						System.out.println(e.getMessage());
					}
				}
				Contador++;				//A cada 2 segundos limpa a lista para evitar conter servidores ja desligados
				if(Contador == 4){
					Contador = 0;
					servs.clear();
				}
			}
		}
		
	}

	class OuvirServer extends Thread {
		public boolean pausada = true; 
		
		public void run() {
//System.out.println("ouviu");
			while(true){
				synchronized (this) {
					while(pausada){
						try {
							wait();
						} catch (Exception e) {
							System.out.println(e.getMessage());
						}
					}					
				}
				String msg = udpSocketS.receberMsg();
				Scanner scan = new Scanner(msg);  
				String cmd = scan.nextLine();				
				if(cmd.equals(Constantes.CMD_ESTADO_ON_SERVIDOR))
					addServer(udpSocketS.getRcvIp(), scan.nextLine(), scan.nextLine());				
			}
		}
		
	}

}
